// ==++== 
//
//   Copyright (c) Microsoft Corporation.  All rights reserved.
//
// ==--== 
/*============================================================
** 
** File:    RemotingConfiguration.cs 
**
** Purpose: Classes for interfacing with remoting configuration 
**            settings
**
**
===========================================================*/ 

using System; 
using System.Security; 
using System.Security.Permissions;
using System.Runtime.Remoting.Activation; 
using System.Runtime.Remoting.Contexts;
using System.Runtime.CompilerServices;
using StackCrawlMark = System.Threading.StackCrawlMark;
using System.Runtime.Versioning; 
using System.Diagnostics.Contracts;
 
namespace System.Runtime.Remoting 
{
    // Configuration - provides static methods interfacing with 
    //   configuration settings.
    [System.Runtime.InteropServices.ComVisible(true)]
    public static class RemotingConfiguration
    { 
        private static bool s_ListeningForActivationRequests = false;
 
        [System.Security.SecuritySafeCritical]  // auto-generated 
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)]
        [ResourceExposure(ResourceScope.Machine)] 
        [ResourceConsumption(ResourceScope.Machine)]
        [Obsolete("Use System.Runtime.Remoting.RemotingConfiguration.Configure(string fileName, bool ensureSecurity) instead.", false)]
        public static void Configure(String filename)
        { 
            Configure(filename, false/*ensureSecurity*/);
        } 
        [System.Security.SecuritySafeCritical]  // auto-generated 
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)]
        [ResourceExposure(ResourceScope.Machine)] 
        [ResourceConsumption(ResourceScope.Machine)]
        public static void Configure(String filename, bool ensureSecurity)
        {
            RemotingConfigHandler.DoConfiguration(filename, ensureSecurity); 

            // Set a flag in the VM to mark that remoting is configured 
            // This will enable us to decide if activation for MBR 
            // objects should go through the managed codepath
            RemotingServices.InternalSetRemoteActivationConfigured(); 

        } // Configure

        public static String ApplicationName 
        {
            get 
            { 
                if (!RemotingConfigHandler.HasApplicationNameBeenSet())
                    return null; 
                else
                    return RemotingConfigHandler.ApplicationName;
            }
 
            [System.Security.SecuritySafeCritical]  // auto-generated
            [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)] 
            set 
            {
                RemotingConfigHandler.ApplicationName = value; 
            }
        } // ApplicationName

 
        // The application id is prepended to object uri's.
        public static String ApplicationId 
        { 
            [System.Security.SecurityCritical]  // auto-generated_required
            get { return Identity.AppDomainUniqueId; } 
        } // ApplicationId

        public static String ProcessId
        { 
            [System.Security.SecurityCritical]  // auto-generated_required
            get { return Identity.ProcessGuid;} 
        } 

        public static CustomErrorsModes CustomErrorsMode 
        {
            get { return RemotingConfigHandler.CustomErrorsMode; }

            [System.Security.SecuritySafeCritical]  // auto-generated 
            [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)]
            set 
            { 
                RemotingConfigHandler.CustomErrorsMode = value;
            } 

        }

        public static bool CustomErrorsEnabled(bool isLocalRequest) 
        {
            switch (CustomErrorsMode) 
            { 
                case CustomErrorsModes.Off:
                    return false; 

                case CustomErrorsModes.On:
                    return true;
 
                case CustomErrorsModes.RemoteOnly:
                    return(!isLocalRequest); 
 
                default:
                    return true; 
            }
        }

        [System.Security.SecuritySafeCritical]  // auto-generated 
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)]
        public static void RegisterActivatedServiceType(Type type) 
        { 
            ActivatedServiceTypeEntry entry = new ActivatedServiceTypeEntry(type);
            RemotingConfiguration.RegisterActivatedServiceType(entry); 
        } // RegisterActivatedServiceType


        [System.Security.SecuritySafeCritical]  // auto-generated 
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)]
        public static void RegisterActivatedServiceType(ActivatedServiceTypeEntry entry) 
        { 
            RemotingConfigHandler.RegisterActivatedServiceType(entry);
 
            // make sure we're listening for activation requests
            //  (all registrations for activated service types will come through here)
            if (!s_ListeningForActivationRequests)
            { 
                s_ListeningForActivationRequests = true;
                ActivationServices.StartListeningForRemoteRequests(); 
            } 
        } // RegisterActivatedServiceType
 

        [System.Security.SecuritySafeCritical]  // auto-generated
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)]
        public static void RegisterWellKnownServiceType( 
            Type type, String objectUri, WellKnownObjectMode mode)
        { 
            WellKnownServiceTypeEntry wke = 
                new WellKnownServiceTypeEntry(type, objectUri, mode);
            RemotingConfiguration.RegisterWellKnownServiceType(wke); 
        } // RegisterWellKnownServiceType


 
        [System.Security.SecuritySafeCritical]  // auto-generated
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)] 
        public static void RegisterWellKnownServiceType(WellKnownServiceTypeEntry entry) 
        {
            RemotingConfigHandler.RegisterWellKnownServiceType(entry); 
        } // RegisterWellKnownServiceType


        [System.Security.SecuritySafeCritical]  // auto-generated 
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)]
        public static void RegisterActivatedClientType(Type type, String appUrl) 
        { 
            ActivatedClientTypeEntry acte =
                new ActivatedClientTypeEntry(type, appUrl); 
            RemotingConfiguration.RegisterActivatedClientType(acte);
        } // RegisterActivatedClientType

 

        [System.Security.SecuritySafeCritical]  // auto-generated 
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)] 
        public static void RegisterActivatedClientType(ActivatedClientTypeEntry entry)
        { 
            RemotingConfigHandler.RegisterActivatedClientType(entry);

            // all registrations for activated client types will come through here
            RemotingServices.InternalSetRemoteActivationConfigured(); 
        } // RegisterActivatedClientType
 
 

 
        [System.Security.SecuritySafeCritical]  // auto-generated
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)]
        public static void RegisterWellKnownClientType(Type type, String objectUrl)
        { 
            WellKnownClientTypeEntry wke = new WellKnownClientTypeEntry(type, objectUrl);
            RemotingConfiguration.RegisterWellKnownClientType(wke); 
        } // RegisterWellKnownClientType 

 

        [System.Security.SecuritySafeCritical]  // auto-generated
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)]
        public static void RegisterWellKnownClientType(WellKnownClientTypeEntry entry) 
        {
            RemotingConfigHandler.RegisterWellKnownClientType(entry); 
 
            // all registrations for wellknown client types will come through here
            RemotingServices.InternalSetRemoteActivationConfigured(); 
        } // RegisterWellKnownClientType


        [System.Security.SecuritySafeCritical]  // auto-generated 
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)]
        public static ActivatedServiceTypeEntry[] GetRegisteredActivatedServiceTypes() 
        { 
            return RemotingConfigHandler.GetRegisteredActivatedServiceTypes();
        } 

        [System.Security.SecuritySafeCritical]  // auto-generated
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)]
        public static WellKnownServiceTypeEntry[] GetRegisteredWellKnownServiceTypes() 
        {
            return RemotingConfigHandler.GetRegisteredWellKnownServiceTypes(); 
        } 

 
        [System.Security.SecuritySafeCritical]  // auto-generated
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)]
        public static ActivatedClientTypeEntry[] GetRegisteredActivatedClientTypes()
        { 
            return RemotingConfigHandler.GetRegisteredActivatedClientTypes();
        } 
 
        [System.Security.SecuritySafeCritical]  // auto-generated
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)] 
        public static WellKnownClientTypeEntry[] GetRegisteredWellKnownClientTypes()
        {
            return RemotingConfigHandler.GetRegisteredWellKnownClientTypes();
        } 

 
        // This is used at the client end to check if an activation needs 
        // to go remote.
        [System.Security.SecuritySafeCritical]  // auto-generated 
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)]
        public static ActivatedClientTypeEntry IsRemotelyActivatedClientType(Type svrType)
        {
            if (svrType == null) 
                throw new ArgumentNullException("svrType");
 
            RuntimeType rt = svrType as RuntimeType; 
            if (rt == null)
                throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeType")); 

            return RemotingConfigHandler.IsRemotelyActivatedClientType(rt);
        }
 
        // This is used at the client end to check if an activation needs
        // to go remote. 
 
        [System.Security.SecuritySafeCritical]  // auto-generated
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)] 
        public static ActivatedClientTypeEntry IsRemotelyActivatedClientType(String typeName, String assemblyName)
        {
            return RemotingConfigHandler.IsRemotelyActivatedClientType(typeName, assemblyName);
        } 

 
        // This is used at the client end to check if a "new Foo" needs to 
        // happen via a Connect() under the covers.
        [System.Security.SecuritySafeCritical]  // auto-generated 
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)]
        public static WellKnownClientTypeEntry IsWellKnownClientType(Type svrType)
        {
            if (svrType == null) 
                throw new ArgumentNullException("svrType");
 
            RuntimeType rt = svrType as RuntimeType; 
            if (rt == null)
                throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeType")); 

            return RemotingConfigHandler.IsWellKnownClientType(rt);
        }
 
        // This is used at the client end to check if a "new Foo" needs to
        // happen via a Connect() under the covers. 
        [System.Security.SecuritySafeCritical]  // auto-generated 
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)]
        public static WellKnownClientTypeEntry IsWellKnownClientType(String typeName, 
                                                                       String assemblyName)
        {
            return RemotingConfigHandler.IsWellKnownClientType(typeName, assemblyName);
        } 

        // This is used at the server end to check if a type being activated 
        // is explicitly allowed by the server. 
        [System.Security.SecuritySafeCritical]  // auto-generated
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)] 
        public static bool IsActivationAllowed(Type svrType)
        {
            RuntimeType rt = svrType as RuntimeType;
            if (svrType != null && rt == null) 
                throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeType"));
 
            return RemotingConfigHandler.IsActivationAllowed(rt); 
        }
 
    } // class Configuration


 
    //
    // The following classes are used to register and retrieve remoted type information 
    // 

    // Base class for all configuration entries 
[System.Runtime.InteropServices.ComVisible(true)]
    public class TypeEntry
    {
        String _typeName; 
        String _assemblyName;
        RemoteAppEntry _cachedRemoteAppEntry = null; 
 
        protected TypeEntry()
        { 
            // Forbid creation of this class by outside users...
        }

        public String TypeName { get { return _typeName; } set {_typeName = value;} } 

        public String AssemblyName { get { return _assemblyName; } set {_assemblyName = value;} } 
 
        internal void CacheRemoteAppEntry(RemoteAppEntry entry) {_cachedRemoteAppEntry = entry;}
        internal RemoteAppEntry GetRemoteAppEntry() { return _cachedRemoteAppEntry;} 

    }

[System.Runtime.InteropServices.ComVisible(true)] 
    public class ActivatedClientTypeEntry : TypeEntry
    { 
        String _appUrl;  // url of application to activate the type in 

        // optional data 
        IContextAttribute[] _contextAttributes = null;


        public ActivatedClientTypeEntry(String typeName, String assemblyName, String appUrl) 
        {
            if (typeName == null) 
                throw new ArgumentNullException("typeName"); 
            if (assemblyName == null)
                throw new ArgumentNullException("assemblyName"); 
            if (appUrl == null)
                throw new ArgumentNullException("appUrl");
            Contract.EndContractBlock();
 
            TypeName = typeName;
            AssemblyName = assemblyName; 
            _appUrl = appUrl; 
        } // ActivatedClientTypeEntry
 
        [System.Security.SecuritySafeCritical]  // auto-generated
        public ActivatedClientTypeEntry(Type type, String appUrl)
        {
            if (type == null) 
                throw new ArgumentNullException("type");
            if (appUrl == null) 
                throw new ArgumentNullException("appUrl"); 
            Contract.EndContractBlock();
 
            RuntimeType rtType = type as RuntimeType;
            if (rtType == null)
                throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeAssembly"));
 
            TypeName = type.FullName;
            AssemblyName = rtType.GetRuntimeAssembly().GetSimpleName(); 
            _appUrl = appUrl; 
        } // ActivatedClientTypeEntry
 
        public String ApplicationUrl { get { return _appUrl; } }

        public Type ObjectType
        { 
            [MethodImplAttribute(MethodImplOptions.NoInlining)] // Methods containing StackCrawlMark local var has to be marked non-inlineable
            get { 
                StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; 
                return RuntimeTypeHandle.GetTypeByName(TypeName + ", " + AssemblyName, ref stackMark);
            } 
        }

        public IContextAttribute[] ContextAttributes
        { 
            get { return _contextAttributes; }
            set { _contextAttributes = value; } 
        } 

 
        public override String ToString()
        {
            return "type='" + TypeName + ", " + AssemblyName + "'; appUrl=" + _appUrl;
        } 

    } // class ActivatedClientTypeEntry 
 

[System.Runtime.InteropServices.ComVisible(true)] 
    public class ActivatedServiceTypeEntry : TypeEntry
    {
        // optional data
        IContextAttribute[] _contextAttributes = null; 

 
        public ActivatedServiceTypeEntry(String typeName, String assemblyName) 
        {
            if (typeName == null) 
                throw new ArgumentNullException("typeName");
            if (assemblyName == null)
                throw new ArgumentNullException("assemblyName");
            Contract.EndContractBlock(); 
            TypeName = typeName;
            AssemblyName = assemblyName; 
        } 

        [System.Security.SecuritySafeCritical]  // auto-generated 
        public ActivatedServiceTypeEntry(Type type)
        {
            if (type == null)
                throw new ArgumentNullException("type"); 
            Contract.EndContractBlock();
 
            RuntimeType rtType = type as RuntimeType; 
            if (rtType == null)
                throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeAssembly")); 

            TypeName = type.FullName;
            AssemblyName = rtType.GetRuntimeAssembly().GetSimpleName();
        } 

        public Type ObjectType 
        { 
            [MethodImplAttribute(MethodImplOptions.NoInlining)] // Methods containing StackCrawlMark local var has to be marked non-inlineable
            get { 
                StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
                return RuntimeTypeHandle.GetTypeByName(TypeName + ", " + AssemblyName, ref stackMark);
            }
        } 

        public IContextAttribute[] ContextAttributes 
        { 
            get { return _contextAttributes; }
            set { _contextAttributes = value; } 
        }


        public override String ToString() 
        {
            return "type='" + TypeName + ", " + AssemblyName + "'"; 
        } 

    } // class ActivatedServiceTypeEntry 


[System.Runtime.InteropServices.ComVisible(true)]
    public class WellKnownClientTypeEntry : TypeEntry 
    {
        String _objectUrl; 
 
        // optional data
        String _appUrl = null; // url of application to associate this object with 


        public WellKnownClientTypeEntry(String typeName, String assemblyName, String objectUrl)
        { 
            if (typeName == null)
                throw new ArgumentNullException("typeName"); 
            if (assemblyName == null) 
                throw new ArgumentNullException("assemblyName");
            if (objectUrl == null) 
                throw new ArgumentNullException("objectUrl");
            Contract.EndContractBlock();

            TypeName = typeName; 
            AssemblyName = assemblyName;
            _objectUrl = objectUrl; 
        } 

        [System.Security.SecuritySafeCritical]  // auto-generated 
        public WellKnownClientTypeEntry(Type type, String objectUrl)
        {
            if (type == null)
                throw new ArgumentNullException("type"); 
            if (objectUrl == null)
                throw new ArgumentNullException("objectUrl"); 
            Contract.EndContractBlock(); 

            RuntimeType rtType = type as RuntimeType; 
            if (rtType == null)
                throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeType"));

            TypeName = type.FullName; 
            AssemblyName = rtType.GetRuntimeAssembly().GetSimpleName();
            _objectUrl = objectUrl; 
        } 

        public String ObjectUrl { get { return _objectUrl; } } 

        public Type ObjectType
        {
            [MethodImplAttribute(MethodImplOptions.NoInlining)] // Methods containing StackCrawlMark local var has to be marked non-inlineable 
            get {
                StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; 
                return RuntimeTypeHandle.GetTypeByName(TypeName + ", " + AssemblyName, ref stackMark); 
            }
        } 

        public String ApplicationUrl
        {
            get { return _appUrl; } 
            set { _appUrl = value; }
        } 
 
        public override String ToString()
        { 
            String str = "type='" + TypeName + ", " + AssemblyName + "'; url=" + _objectUrl;
            if (_appUrl != null)
                str += "; appUrl=" + _appUrl;
            return str; 
        }
 
    } // class WellKnownClientTypeEntry 

 
[System.Runtime.InteropServices.ComVisible(true)]
    public class WellKnownServiceTypeEntry : TypeEntry
    {
        String _objectUri; 
        WellKnownObjectMode _mode;
 
        // optional data 
        IContextAttribute[] _contextAttributes = null;
 
        public WellKnownServiceTypeEntry(String typeName, String assemblyName, String objectUri,
                                         WellKnownObjectMode mode)
        {
            if (typeName == null) 
                throw new ArgumentNullException("typeName");
            if (assemblyName == null) 
                throw new ArgumentNullException("assemblyName"); 
            if (objectUri == null)
                throw new ArgumentNullException("objectUri"); 
            Contract.EndContractBlock();

            TypeName = typeName;
            AssemblyName = assemblyName; 
            _objectUri = objectUri;
            _mode = mode; 
        } 

        public WellKnownServiceTypeEntry(Type type, String objectUri, WellKnownObjectMode mode) 
        {
            if (type == null)
                throw new ArgumentNullException("type");
            if (objectUri == null) 
                throw new ArgumentNullException("objectUri");
            Contract.EndContractBlock(); 
 
            if (!(type is RuntimeType))
                throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeType")); 

            TypeName = type.FullName;
            AssemblyName = type.Module.Assembly.FullName;
            _objectUri = objectUri; 
            _mode = mode;
        } 
 
        public String ObjectUri { get { return _objectUri; } }
 
        public WellKnownObjectMode Mode { get { return _mode; } }

        public Type ObjectType
        { 
            [MethodImplAttribute(MethodImplOptions.NoInlining)] // Methods containing StackCrawlMark local var has to be marked non-inlineable
            get { 
                StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; 
                return RuntimeTypeHandle.GetTypeByName(TypeName + ", " + AssemblyName, ref stackMark);
            } 
        }

        public IContextAttribute[] ContextAttributes
        { 
            get { return _contextAttributes; }
            set { _contextAttributes = value; } 
        } 

 
        public override String ToString()
        {
            return "type='" + TypeName + ", " + AssemblyName + "'; objectUri=" + _objectUri +
                "; mode=" + _mode.ToString(); 
        }
 
    } // class WellKnownServiceTypeEntry 

    internal class RemoteAppEntry 
    {
        String _remoteAppName;
        String _remoteAppURI;
        internal RemoteAppEntry(String appName, String appURI) 
        {
            Contract.Assert(appURI != null, "Bad remote app URI"); 
            _remoteAppName = appName; 
            _remoteAppURI = appURI;
        } 
        internal String GetAppURI() { return _remoteAppURI;}
    } // class RemoteAppEntry

[System.Runtime.InteropServices.ComVisible(true)] 
    public enum CustomErrorsModes {
        On, 
        Off, 
        RemoteOnly
    } 

} // namespace System.Runtime.Remoting

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// ==++== 
//
//   Copyright (c) Microsoft Corporation.  All rights reserved.
//
// ==--== 
/*============================================================
** 
** File:    RemotingConfiguration.cs 
**
** Purpose: Classes for interfacing with remoting configuration 
**            settings
**
**
===========================================================*/ 

using System; 
using System.Security; 
using System.Security.Permissions;
using System.Runtime.Remoting.Activation; 
using System.Runtime.Remoting.Contexts;
using System.Runtime.CompilerServices;
using StackCrawlMark = System.Threading.StackCrawlMark;
using System.Runtime.Versioning; 
using System.Diagnostics.Contracts;
 
namespace System.Runtime.Remoting 
{
    // Configuration - provides static methods interfacing with 
    //   configuration settings.
    [System.Runtime.InteropServices.ComVisible(true)]
    public static class RemotingConfiguration
    { 
        private static bool s_ListeningForActivationRequests = false;
 
        [System.Security.SecuritySafeCritical]  // auto-generated 
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)]
        [ResourceExposure(ResourceScope.Machine)] 
        [ResourceConsumption(ResourceScope.Machine)]
        [Obsolete("Use System.Runtime.Remoting.RemotingConfiguration.Configure(string fileName, bool ensureSecurity) instead.", false)]
        public static void Configure(String filename)
        { 
            Configure(filename, false/*ensureSecurity*/);
        } 
        [System.Security.SecuritySafeCritical]  // auto-generated 
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)]
        [ResourceExposure(ResourceScope.Machine)] 
        [ResourceConsumption(ResourceScope.Machine)]
        public static void Configure(String filename, bool ensureSecurity)
        {
            RemotingConfigHandler.DoConfiguration(filename, ensureSecurity); 

            // Set a flag in the VM to mark that remoting is configured 
            // This will enable us to decide if activation for MBR 
            // objects should go through the managed codepath
            RemotingServices.InternalSetRemoteActivationConfigured(); 

        } // Configure

        public static String ApplicationName 
        {
            get 
            { 
                if (!RemotingConfigHandler.HasApplicationNameBeenSet())
                    return null; 
                else
                    return RemotingConfigHandler.ApplicationName;
            }
 
            [System.Security.SecuritySafeCritical]  // auto-generated
            [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)] 
            set 
            {
                RemotingConfigHandler.ApplicationName = value; 
            }
        } // ApplicationName

 
        // The application id is prepended to object uri's.
        public static String ApplicationId 
        { 
            [System.Security.SecurityCritical]  // auto-generated_required
            get { return Identity.AppDomainUniqueId; } 
        } // ApplicationId

        public static String ProcessId
        { 
            [System.Security.SecurityCritical]  // auto-generated_required
            get { return Identity.ProcessGuid;} 
        } 

        public static CustomErrorsModes CustomErrorsMode 
        {
            get { return RemotingConfigHandler.CustomErrorsMode; }

            [System.Security.SecuritySafeCritical]  // auto-generated 
            [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)]
            set 
            { 
                RemotingConfigHandler.CustomErrorsMode = value;
            } 

        }

        public static bool CustomErrorsEnabled(bool isLocalRequest) 
        {
            switch (CustomErrorsMode) 
            { 
                case CustomErrorsModes.Off:
                    return false; 

                case CustomErrorsModes.On:
                    return true;
 
                case CustomErrorsModes.RemoteOnly:
                    return(!isLocalRequest); 
 
                default:
                    return true; 
            }
        }

        [System.Security.SecuritySafeCritical]  // auto-generated 
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)]
        public static void RegisterActivatedServiceType(Type type) 
        { 
            ActivatedServiceTypeEntry entry = new ActivatedServiceTypeEntry(type);
            RemotingConfiguration.RegisterActivatedServiceType(entry); 
        } // RegisterActivatedServiceType


        [System.Security.SecuritySafeCritical]  // auto-generated 
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)]
        public static void RegisterActivatedServiceType(ActivatedServiceTypeEntry entry) 
        { 
            RemotingConfigHandler.RegisterActivatedServiceType(entry);
 
            // make sure we're listening for activation requests
            //  (all registrations for activated service types will come through here)
            if (!s_ListeningForActivationRequests)
            { 
                s_ListeningForActivationRequests = true;
                ActivationServices.StartListeningForRemoteRequests(); 
            } 
        } // RegisterActivatedServiceType
 

        [System.Security.SecuritySafeCritical]  // auto-generated
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)]
        public static void RegisterWellKnownServiceType( 
            Type type, String objectUri, WellKnownObjectMode mode)
        { 
            WellKnownServiceTypeEntry wke = 
                new WellKnownServiceTypeEntry(type, objectUri, mode);
            RemotingConfiguration.RegisterWellKnownServiceType(wke); 
        } // RegisterWellKnownServiceType


 
        [System.Security.SecuritySafeCritical]  // auto-generated
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)] 
        public static void RegisterWellKnownServiceType(WellKnownServiceTypeEntry entry) 
        {
            RemotingConfigHandler.RegisterWellKnownServiceType(entry); 
        } // RegisterWellKnownServiceType


        [System.Security.SecuritySafeCritical]  // auto-generated 
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)]
        public static void RegisterActivatedClientType(Type type, String appUrl) 
        { 
            ActivatedClientTypeEntry acte =
                new ActivatedClientTypeEntry(type, appUrl); 
            RemotingConfiguration.RegisterActivatedClientType(acte);
        } // RegisterActivatedClientType

 

        [System.Security.SecuritySafeCritical]  // auto-generated 
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)] 
        public static void RegisterActivatedClientType(ActivatedClientTypeEntry entry)
        { 
            RemotingConfigHandler.RegisterActivatedClientType(entry);

            // all registrations for activated client types will come through here
            RemotingServices.InternalSetRemoteActivationConfigured(); 
        } // RegisterActivatedClientType
 
 

 
        [System.Security.SecuritySafeCritical]  // auto-generated
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)]
        public static void RegisterWellKnownClientType(Type type, String objectUrl)
        { 
            WellKnownClientTypeEntry wke = new WellKnownClientTypeEntry(type, objectUrl);
            RemotingConfiguration.RegisterWellKnownClientType(wke); 
        } // RegisterWellKnownClientType 

 

        [System.Security.SecuritySafeCritical]  // auto-generated
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)]
        public static void RegisterWellKnownClientType(WellKnownClientTypeEntry entry) 
        {
            RemotingConfigHandler.RegisterWellKnownClientType(entry); 
 
            // all registrations for wellknown client types will come through here
            RemotingServices.InternalSetRemoteActivationConfigured(); 
        } // RegisterWellKnownClientType


        [System.Security.SecuritySafeCritical]  // auto-generated 
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)]
        public static ActivatedServiceTypeEntry[] GetRegisteredActivatedServiceTypes() 
        { 
            return RemotingConfigHandler.GetRegisteredActivatedServiceTypes();
        } 

        [System.Security.SecuritySafeCritical]  // auto-generated
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)]
        public static WellKnownServiceTypeEntry[] GetRegisteredWellKnownServiceTypes() 
        {
            return RemotingConfigHandler.GetRegisteredWellKnownServiceTypes(); 
        } 

 
        [System.Security.SecuritySafeCritical]  // auto-generated
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)]
        public static ActivatedClientTypeEntry[] GetRegisteredActivatedClientTypes()
        { 
            return RemotingConfigHandler.GetRegisteredActivatedClientTypes();
        } 
 
        [System.Security.SecuritySafeCritical]  // auto-generated
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)] 
        public static WellKnownClientTypeEntry[] GetRegisteredWellKnownClientTypes()
        {
            return RemotingConfigHandler.GetRegisteredWellKnownClientTypes();
        } 

 
        // This is used at the client end to check if an activation needs 
        // to go remote.
        [System.Security.SecuritySafeCritical]  // auto-generated 
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)]
        public static ActivatedClientTypeEntry IsRemotelyActivatedClientType(Type svrType)
        {
            if (svrType == null) 
                throw new ArgumentNullException("svrType");
 
            RuntimeType rt = svrType as RuntimeType; 
            if (rt == null)
                throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeType")); 

            return RemotingConfigHandler.IsRemotelyActivatedClientType(rt);
        }
 
        // This is used at the client end to check if an activation needs
        // to go remote. 
 
        [System.Security.SecuritySafeCritical]  // auto-generated
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)] 
        public static ActivatedClientTypeEntry IsRemotelyActivatedClientType(String typeName, String assemblyName)
        {
            return RemotingConfigHandler.IsRemotelyActivatedClientType(typeName, assemblyName);
        } 

 
        // This is used at the client end to check if a "new Foo" needs to 
        // happen via a Connect() under the covers.
        [System.Security.SecuritySafeCritical]  // auto-generated 
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)]
        public static WellKnownClientTypeEntry IsWellKnownClientType(Type svrType)
        {
            if (svrType == null) 
                throw new ArgumentNullException("svrType");
 
            RuntimeType rt = svrType as RuntimeType; 
            if (rt == null)
                throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeType")); 

            return RemotingConfigHandler.IsWellKnownClientType(rt);
        }
 
        // This is used at the client end to check if a "new Foo" needs to
        // happen via a Connect() under the covers. 
        [System.Security.SecuritySafeCritical]  // auto-generated 
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)]
        public static WellKnownClientTypeEntry IsWellKnownClientType(String typeName, 
                                                                       String assemblyName)
        {
            return RemotingConfigHandler.IsWellKnownClientType(typeName, assemblyName);
        } 

        // This is used at the server end to check if a type being activated 
        // is explicitly allowed by the server. 
        [System.Security.SecuritySafeCritical]  // auto-generated
        [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)] 
        public static bool IsActivationAllowed(Type svrType)
        {
            RuntimeType rt = svrType as RuntimeType;
            if (svrType != null && rt == null) 
                throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeType"));
 
            return RemotingConfigHandler.IsActivationAllowed(rt); 
        }
 
    } // class Configuration


 
    //
    // The following classes are used to register and retrieve remoted type information 
    // 

    // Base class for all configuration entries 
[System.Runtime.InteropServices.ComVisible(true)]
    public class TypeEntry
    {
        String _typeName; 
        String _assemblyName;
        RemoteAppEntry _cachedRemoteAppEntry = null; 
 
        protected TypeEntry()
        { 
            // Forbid creation of this class by outside users...
        }

        public String TypeName { get { return _typeName; } set {_typeName = value;} } 

        public String AssemblyName { get { return _assemblyName; } set {_assemblyName = value;} } 
 
        internal void CacheRemoteAppEntry(RemoteAppEntry entry) {_cachedRemoteAppEntry = entry;}
        internal RemoteAppEntry GetRemoteAppEntry() { return _cachedRemoteAppEntry;} 

    }

[System.Runtime.InteropServices.ComVisible(true)] 
    public class ActivatedClientTypeEntry : TypeEntry
    { 
        String _appUrl;  // url of application to activate the type in 

        // optional data 
        IContextAttribute[] _contextAttributes = null;


        public ActivatedClientTypeEntry(String typeName, String assemblyName, String appUrl) 
        {
            if (typeName == null) 
                throw new ArgumentNullException("typeName"); 
            if (assemblyName == null)
                throw new ArgumentNullException("assemblyName"); 
            if (appUrl == null)
                throw new ArgumentNullException("appUrl");
            Contract.EndContractBlock();
 
            TypeName = typeName;
            AssemblyName = assemblyName; 
            _appUrl = appUrl; 
        } // ActivatedClientTypeEntry
 
        [System.Security.SecuritySafeCritical]  // auto-generated
        public ActivatedClientTypeEntry(Type type, String appUrl)
        {
            if (type == null) 
                throw new ArgumentNullException("type");
            if (appUrl == null) 
                throw new ArgumentNullException("appUrl"); 
            Contract.EndContractBlock();
 
            RuntimeType rtType = type as RuntimeType;
            if (rtType == null)
                throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeAssembly"));
 
            TypeName = type.FullName;
            AssemblyName = rtType.GetRuntimeAssembly().GetSimpleName(); 
            _appUrl = appUrl; 
        } // ActivatedClientTypeEntry
 
        public String ApplicationUrl { get { return _appUrl; } }

        public Type ObjectType
        { 
            [MethodImplAttribute(MethodImplOptions.NoInlining)] // Methods containing StackCrawlMark local var has to be marked non-inlineable
            get { 
                StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; 
                return RuntimeTypeHandle.GetTypeByName(TypeName + ", " + AssemblyName, ref stackMark);
            } 
        }

        public IContextAttribute[] ContextAttributes
        { 
            get { return _contextAttributes; }
            set { _contextAttributes = value; } 
        } 

 
        public override String ToString()
        {
            return "type='" + TypeName + ", " + AssemblyName + "'; appUrl=" + _appUrl;
        } 

    } // class ActivatedClientTypeEntry 
 

[System.Runtime.InteropServices.ComVisible(true)] 
    public class ActivatedServiceTypeEntry : TypeEntry
    {
        // optional data
        IContextAttribute[] _contextAttributes = null; 

 
        public ActivatedServiceTypeEntry(String typeName, String assemblyName) 
        {
            if (typeName == null) 
                throw new ArgumentNullException("typeName");
            if (assemblyName == null)
                throw new ArgumentNullException("assemblyName");
            Contract.EndContractBlock(); 
            TypeName = typeName;
            AssemblyName = assemblyName; 
        } 

        [System.Security.SecuritySafeCritical]  // auto-generated 
        public ActivatedServiceTypeEntry(Type type)
        {
            if (type == null)
                throw new ArgumentNullException("type"); 
            Contract.EndContractBlock();
 
            RuntimeType rtType = type as RuntimeType; 
            if (rtType == null)
                throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeAssembly")); 

            TypeName = type.FullName;
            AssemblyName = rtType.GetRuntimeAssembly().GetSimpleName();
        } 

        public Type ObjectType 
        { 
            [MethodImplAttribute(MethodImplOptions.NoInlining)] // Methods containing StackCrawlMark local var has to be marked non-inlineable
            get { 
                StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
                return RuntimeTypeHandle.GetTypeByName(TypeName + ", " + AssemblyName, ref stackMark);
            }
        } 

        public IContextAttribute[] ContextAttributes 
        { 
            get { return _contextAttributes; }
            set { _contextAttributes = value; } 
        }


        public override String ToString() 
        {
            return "type='" + TypeName + ", " + AssemblyName + "'"; 
        } 

    } // class ActivatedServiceTypeEntry 


[System.Runtime.InteropServices.ComVisible(true)]
    public class WellKnownClientTypeEntry : TypeEntry 
    {
        String _objectUrl; 
 
        // optional data
        String _appUrl = null; // url of application to associate this object with 


        public WellKnownClientTypeEntry(String typeName, String assemblyName, String objectUrl)
        { 
            if (typeName == null)
                throw new ArgumentNullException("typeName"); 
            if (assemblyName == null) 
                throw new ArgumentNullException("assemblyName");
            if (objectUrl == null) 
                throw new ArgumentNullException("objectUrl");
            Contract.EndContractBlock();

            TypeName = typeName; 
            AssemblyName = assemblyName;
            _objectUrl = objectUrl; 
        } 

        [System.Security.SecuritySafeCritical]  // auto-generated 
        public WellKnownClientTypeEntry(Type type, String objectUrl)
        {
            if (type == null)
                throw new ArgumentNullException("type"); 
            if (objectUrl == null)
                throw new ArgumentNullException("objectUrl"); 
            Contract.EndContractBlock(); 

            RuntimeType rtType = type as RuntimeType; 
            if (rtType == null)
                throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeType"));

            TypeName = type.FullName; 
            AssemblyName = rtType.GetRuntimeAssembly().GetSimpleName();
            _objectUrl = objectUrl; 
        } 

        public String ObjectUrl { get { return _objectUrl; } } 

        public Type ObjectType
        {
            [MethodImplAttribute(MethodImplOptions.NoInlining)] // Methods containing StackCrawlMark local var has to be marked non-inlineable 
            get {
                StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; 
                return RuntimeTypeHandle.GetTypeByName(TypeName + ", " + AssemblyName, ref stackMark); 
            }
        } 

        public String ApplicationUrl
        {
            get { return _appUrl; } 
            set { _appUrl = value; }
        } 
 
        public override String ToString()
        { 
            String str = "type='" + TypeName + ", " + AssemblyName + "'; url=" + _objectUrl;
            if (_appUrl != null)
                str += "; appUrl=" + _appUrl;
            return str; 
        }
 
    } // class WellKnownClientTypeEntry 

 
[System.Runtime.InteropServices.ComVisible(true)]
    public class WellKnownServiceTypeEntry : TypeEntry
    {
        String _objectUri; 
        WellKnownObjectMode _mode;
 
        // optional data 
        IContextAttribute[] _contextAttributes = null;
 
        public WellKnownServiceTypeEntry(String typeName, String assemblyName, String objectUri,
                                         WellKnownObjectMode mode)
        {
            if (typeName == null) 
                throw new ArgumentNullException("typeName");
            if (assemblyName == null) 
                throw new ArgumentNullException("assemblyName"); 
            if (objectUri == null)
                throw new ArgumentNullException("objectUri"); 
            Contract.EndContractBlock();

            TypeName = typeName;
            AssemblyName = assemblyName; 
            _objectUri = objectUri;
            _mode = mode; 
        } 

        public WellKnownServiceTypeEntry(Type type, String objectUri, WellKnownObjectMode mode) 
        {
            if (type == null)
                throw new ArgumentNullException("type");
            if (objectUri == null) 
                throw new ArgumentNullException("objectUri");
            Contract.EndContractBlock(); 
 
            if (!(type is RuntimeType))
                throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeType")); 

            TypeName = type.FullName;
            AssemblyName = type.Module.Assembly.FullName;
            _objectUri = objectUri; 
            _mode = mode;
        } 
 
        public String ObjectUri { get { return _objectUri; } }
 
        public WellKnownObjectMode Mode { get { return _mode; } }

        public Type ObjectType
        { 
            [MethodImplAttribute(MethodImplOptions.NoInlining)] // Methods containing StackCrawlMark local var has to be marked non-inlineable
            get { 
                StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; 
                return RuntimeTypeHandle.GetTypeByName(TypeName + ", " + AssemblyName, ref stackMark);
            } 
        }

        public IContextAttribute[] ContextAttributes
        { 
            get { return _contextAttributes; }
            set { _contextAttributes = value; } 
        } 

 
        public override String ToString()
        {
            return "type='" + TypeName + ", " + AssemblyName + "'; objectUri=" + _objectUri +
                "; mode=" + _mode.ToString(); 
        }
 
    } // class WellKnownServiceTypeEntry 

    internal class RemoteAppEntry 
    {
        String _remoteAppName;
        String _remoteAppURI;
        internal RemoteAppEntry(String appName, String appURI) 
        {
            Contract.Assert(appURI != null, "Bad remote app URI"); 
            _remoteAppName = appName; 
            _remoteAppURI = appURI;
        } 
        internal String GetAppURI() { return _remoteAppURI;}
    } // class RemoteAppEntry

[System.Runtime.InteropServices.ComVisible(true)] 
    public enum CustomErrorsModes {
        On, 
        Off, 
        RemoteOnly
    } 

} // namespace System.Runtime.Remoting

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
